﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net;
using System.Configuration;
using ProtocoloCarSharing;

namespace AppAgenteVehiculo
{
    class Program
    {
        public static Cliente cliente = null;
        public static IPAddress ipVehiculo= null;
        public static int tcpPort = 8100;
        public static Vehiculo vehiculo= null;

        static void Main(string[] args)
        {
            ipVehiculo = IPAddress.Parse(ConfigurationManager.AppSettings["IpVehiculo"]);
            tcpPort = Int32.Parse(ConfigurationManager.AppSettings["PuertoTCPVehiculo"]);
            string idVehiculo = ConfigurationManager.AppSettings["IdVehiculo"];

            vehiculo = new Vehiculo(idVehiculo);

            bool exit = false;
            bool vehiculoTomado = false;  

            while (!exit)
            {
                if (!vehiculoTomado)
                {
                    GetHelp();
                    string cmd = Console.ReadLine();

                    switch (cmd.ToLower())
                    {
                        case "tomar_vehiculo":
                            if (vehiculoTomado)
                            {
                                Console.WriteLine("\nEl vehiculo ya esta tomado por un cliente.");
                            }
                            else
                            {
                                vehiculoTomado = Program.TomarVehiculo();
                            }
                            break;                      
                        case "help":
                            GetHelp();
                            break;
                        case "exit":
                            if (vehiculoTomado)
                            {
                                Console.WriteLine("\nDebe abandonar el vehiculo el cliente para salir del programa.");
                            }
                            else
                            {
                                exit = true;
                            }
                            break;
                        default:
                            Console.WriteLine("\nComando no reconocido\n");
                            GetHelp();
                            break;
                    }
                }
                else
                {
                    string cmd = Console.ReadLine();

                    switch (cmd.ToLower())
                    {
                        case "ver_info_viaje":
                            if (!vehiculoTomado)
                            {
                                Console.WriteLine("\nNo hay un vehiculo tomado por algun cliente");
                            }
                            else
                            {
                                Console.WriteLine("\nEl cliente " + cliente.NombreUsuario + " va recorriendo " + cliente.Viaje.KilometrajeTotal + "kms.\n");
                            }
                            break;
                        case "abandonar_vehiculo":
                            if (!vehiculoTomado)
                            {
                                Console.WriteLine("\nEl vehiculo no esta tomado.");
                            }
                            else
                            {
                                vehiculoTomado = !Program.AbandonarVehiculo();
                            }
                            break;
                        case "help":
                            GetHelpVehiculoTomado();
                            break;
                        default:
                            Console.WriteLine("\nComando no reconocido\n");
                            GetHelpVehiculoTomado();
                            break;
                    }
                }
            }
        }

        private static bool AbandonarVehiculo()
        {
            cliente.Viaje.DetenerViaje();

            string clienteInfo = Protocolo.FUERA_DE_SERVICIO + Protocolo.SEPARADOR + cliente.NombreUsuario + Protocolo.SEPARADOR + cliente.Viaje.KilometrajeRecorrido;
            MensajeProtocolo msjReq = new MensajeProtocolo(Protocolo.Header.REQ, Protocolo.Comando.FIN_VIAJE, clienteInfo.Length, clienteInfo);
            MensajeProtocolo msjRes = ConnectionSocket.SocketSendReceive(msjReq);
            cliente = null;

            Console.WriteLine("El cliente ha abandonado el vehiculo.");

            return true;
        }

        private static bool TomarVehiculo()
        {
            Console.Write("\n\nIngresar nombre de usuario: ");
            string username = Console.ReadLine();
            Console.Write("\nIngresar password de usuario: ");
            string password = Console.ReadLine();

            cliente = new Cliente(username, password);
            bool identificado = cliente.IdentificarUsario();
            if (!identificado)
            {
                Console.WriteLine("El usuario ingresado es incorrecto.");
            }
            else
            {
                cliente.IniciarViaje();
                Console.WriteLine("\nUsuario ingresado correctamente\n\n");
                Console.WriteLine("Viaje Iniciado...");
                GetHelpVehiculoTomado();
            }

            return identificado;
        }

        private static void GetHelp()
        {
            string help = "\n\nComandos:\n\n1) tomar_vehiculo: Un cliente se identifica y toma el vehículo\n\n" +
                "2) exit: Salir del programa\n\n" +
                "3) help: Mostrar ayuda\n\n" +
                "Ingresar Comando: ";

            Console.Write(help);
        }

        private static void GetHelpVehiculoTomado()
        {
            string help = "\n\nComandos:\n\n1) ver_info_viaje: Muestra en Pantalla la informacion del cliente en relacion al viaje\n\n" +
                "2) abandonar_vehiculo: El cliente identificado abandona el vehículo\n\n" +
                "3) help: Mostrar ayuda\n\n" +
                "Ingresar Comando: ";

            Console.Write(help);
        }
    }
}
